Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [GDI] Visualizzare un rettangolo in una finestra
Forum - C/C++ - [GDI] Visualizzare un rettangolo in una finestra

Avatar
Saf (Normal User)
Newbie


Messaggi: 13
Iscritto: 13/07/2010

Segnala al moderatore
Postato alle 0:48
Giovedì, 16/09/2010
Spero che in questo forum qualcuno mi aiuti a capire dove sto sbagliando: sto cercando di fare un semplice programma in c++ con le Api di win32 che quando si preme un bottone disegni un rettangolo colorato (è solo per imparare a usare la funzione 'FillRect()'). Magari più avanti permettero di cambiare colore e via dicendo. Tuttavia ora il programma non visualizza alcunchè.

I possibili errori sono:
1) non riesco a creare il DC (device context) dove voglio disegnare;
2) non riesco a dare il colore al pennello 'hbr';
3) non ho definito correttamente il rettangolo 'Rect';
4) non ho capito come usare FillRect() o uno dei parametri di essa...

Per arrivare a questo punto ho passato giornate intere sul sito MSDN, ma ora sono bloccato.. (il compilatore dice che non ci sono errori..)

Posto il codice affinchè qualcuno possa trovare gli errori.
Codice sorgente - presumibilmente C#

  1. #include <windows.h>
  2. #include <windowsx.h>
  3.  
  4.  
  5. BOOL CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
  6. int ed[3];
  7.  
  8. /*1  Creiamo il DC (display) dove disegnare*/
  9. HDC hdc = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
  10. /*2  creiamo un pennello e gli diamo come colore iniziale NERO*/
  11. HBRUSH hbr = CreateSolidBrush(RGB(0,0,0));
  12. /*3  creiamo la classe rettangolo*/
  13. RECT Rect;
  14.  
  15.  
  16.  
  17. int WINAPI WinMain (HINSTANCE hThisInstance,
  18.                     HINSTANCE hPrevInstance,
  19.                     LPSTR lpszArgument,
  20.                     int nFunsterStil){
  21.     HWND hwnd;               /* This is the handle for our window */
  22.     MSG messages;            /* Here messages to the application are saved */
  23.    
  24.     /*Disegniamo la finestra di dialogo*/
  25.     DialogBoxParam(0,"Dlg",0,WindowProcedure,0);
  26.    
  27.     /*4  Impostiamo le coordinate del rettangolo*/
  28.     Rect.left = 5;
  29.     Rect.top = 5;
  30.     Rect.bottom = 500;
  31.     Rect.right = 176;
  32.    
  33.     /* Run the message loop. It will run until GetMessage() returns 0 */
  34.     while (GetMessage (&messages, NULL, 0, 0)){
  35.         /* Translate virtual-key messages into character messages */
  36.         TranslateMessage(&messages);
  37.         /* Send message to WindowProcedure */
  38.         DispatchMessage(&messages);
  39.     }
  40.     /* The program return-value is 0 - The value that PostQuitMessage() gave */
  41.     return messages.wParam;
  42. }
  43.  
  44.  
  45. /*  This function is called by the Windows function DispatchMessage()  */
  46. BOOL CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
  47.     switch (message)  {                /* handle the messages */
  48.         case WM_CLOSE:
  49.             PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
  50.             break;
  51.         case WM_COMMAND:
  52.             if (HIWORD(wParam)==BN_CLICKED&&LOWORD(wParam)==1000){
  53.                /*5  Disegno vero e proprio: col pennello 'hbr' coloriamo il
  54.                     rettangolo 'Rect' contenuto nel display 'hdc'*/
  55.                FillRect(hdc,&Rect,hbr);
  56.             }
  57.             break;
  58.     }
  59.     return 0;
  60. }


Ultima modifica effettuata da HeDo il 16/09/2010 alle 22:02
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 15:32
Giovedì, 16/09/2010

tutto ciò che riguarda il disegno su finestra con le gdi va eseguito nell'evento WM_PAINT, tra le chiamate beginpaint ed endpaint.

se lo fai al di fuori rischi che il refresh della finestra sovrarscriva il tuo disegno, risultando quindi invisibile.

PM Quote